export enum Protocol {
    /** <客户端请求>加入游戏 */
    C2S_JOIN = 1,
    /** <服务端返回>加入游戏成功 */
    S2C_JOIN_OK = 2,
    /** <服务端返回>加入游戏失败 */
    S2C_JOIN_ERR = 3,
    /** <客户端请求>准备好接收数据了 */
    C2S_READY = 4,
    /** <服务端返回>世界大小 */
    S2C_WORLD_SIZE = 101,
    /** <客户端请求>控制角度 */
    C2S_CTRL_TURN = 201,
    /** <客户端请求>控制加速 */
    C2S_CTRL_SPRINT = 202,
    /** <服务端返回>玩家信息 */
    S2C_PLAYER_INFO = 203,
    /** <服务端返回>屏幕焦点 */
    S2C_SCREEN_FOCUS = 204,
    /** <服务端返回>蛇加载 */
    S2C_SNAKE_LOAD = 301,
    /** <服务端返回>蛇卸载 */
    S2C_SNAKE_UNLOAD = 302,
    /** <服务端返回>蛇头部更新 */
    S2C_SNAKE_HID_UPDATE = 303,
    /** <服务端返回>蛇节点加载 */
    S2C_SNAKE_NODE_LOAD = 304,
    /** <服务端返回>蛇节点卸载 */
    S2C_SNAKE_NODE_UNLOAD = 305,
    /** <服务端返回>食物加载 */
    S2C_FOOD_LOAD = 401,
    /** <服务端返回>食物卸载 */
    S2C_FOOD_UNLOAD = 402,
}

const S2C_SNAKE_LOAD_SNAKE = [["id", 5], ["name", 11], ["hid", 5]]
const S2C_SNAKE_HID_UPDATE_SNAKE = [["id", 5], ["hid", 5]]
const S2C_SNAKE_NODE_LOAD_NODE = [["id", 5], ["x", 6], ["y", 6], ["ang", 6], ["idx", 5]]
const S2C_SNAKE_NODE_LOAD_SNAKE = [["id", 5], ["w", 5], ["rgbs", 20, 1], ["loadNodes", 27, 1, S2C_SNAKE_NODE_LOAD_NODE]]
const S2C_FOOD_LOAD_FOOD = [["id", 5], ["x", 6], ["y", 6], ["w", 6], ["rgb", 5]]
const S2C_FOOD_UNLOAD_FOOD = [["id", 5], ["eaterId", 5]]

export const PROTO_STRUCT = {
    1: [["name", 11]],
    2: [["id", 5]],
    3: [["msg", 11]],
    4: [],
    101: [["w", 5], ["h", 5]],
    201: [["ang", 5]],
    202: [["isSprint", 0]],
    203: [["score", 5], ["rank", 5]],
    204: [["nodeId", 5]],
    301: [["loadSnakes", 27, 1, S2C_SNAKE_LOAD_SNAKE]],
    302: [["unloadSnakeIds", 20, 1]],
    303: [["snakes", 27, 1, S2C_SNAKE_HID_UPDATE_SNAKE]],
    304: [["loadSnakes", 27, 1, S2C_SNAKE_NODE_LOAD_SNAKE]],
    305: [["unloadNodeIds", 20, 1]],
    401: [["loadFoods", 27, 1, S2C_FOOD_LOAD_FOOD]],
    402: [["unloadFoods", 27, 1, S2C_FOOD_UNLOAD_FOOD]],
}

export namespace ProtoVo {

    export type Def = {
        [Protocol.C2S_JOIN]: IC2S_JOIN
        [Protocol.S2C_JOIN_OK]: IS2C_JOIN_OK
        [Protocol.S2C_JOIN_ERR]: IS2C_JOIN_ERR
        [Protocol.C2S_READY]: {}
        [Protocol.S2C_WORLD_SIZE]: IS2C_WORLD_SIZE
        [Protocol.C2S_CTRL_TURN]: IC2S_CTRL_TURN
        [Protocol.C2S_CTRL_SPRINT]: IC2S_CTRL_SPRINT
        [Protocol.S2C_PLAYER_INFO]: IS2C_PLAYER_INFO
        [Protocol.S2C_SCREEN_FOCUS]: IS2C_SCREEN_FOCUS
        [Protocol.S2C_SNAKE_LOAD]: IS2C_SNAKE_LOAD
        [Protocol.S2C_SNAKE_UNLOAD]: IS2C_SNAKE_UNLOAD
        [Protocol.S2C_SNAKE_HID_UPDATE]: IS2C_SNAKE_HID_UPDATE
        [Protocol.S2C_SNAKE_NODE_LOAD]: IS2C_SNAKE_NODE_LOAD
        [Protocol.S2C_SNAKE_NODE_UNLOAD]: IS2C_SNAKE_NODE_UNLOAD
        [Protocol.S2C_FOOD_LOAD]: IS2C_FOOD_LOAD
        [Protocol.S2C_FOOD_UNLOAD]: IS2C_FOOD_UNLOAD
    }

    /** <客户端请求>加入游戏 */
    export interface IC2S_JOIN {
        /** 蛇名称 */
        name: string
    }

    /** <服务端返回>加入游戏成功 */
    export interface IS2C_JOIN_OK {
        /** 玩家id */
        id: number
    }

    /** <服务端返回>加入游戏失败 */
    export interface IS2C_JOIN_ERR {
        /** 加入失败消息 */
        msg: string
    }

    /** <服务端返回>世界大小 */
    export interface IS2C_WORLD_SIZE {
        /** 宽度 */
        w: number
        /** 高度 */
        h: number
    }

    /** <客户端请求>控制角度 */
    export interface IC2S_CTRL_TURN {
        /** 角度(x100) */
        ang: number
    }

    /** <客户端请求>控制加速 */
    export interface IC2S_CTRL_SPRINT {
        /** 是否加速 */
        isSprint: boolean
    }

    /** <服务端返回>玩家信息 */
    export interface IS2C_PLAYER_INFO {
        /** 得分 */
        score: number
        /** 排名 */
        rank: number
    }

    /** <服务端返回>屏幕焦点 */
    export interface IS2C_SCREEN_FOCUS {
        /** 蛇节点id */
        nodeId: number
    }

    /** <服务端返回>蛇加载 */
    export interface IS2C_SNAKE_LOAD {
        /** 加载蛇集合 */
        loadSnakes: IS2C_SNAKE_LOAD_SNAKE[]
    }

    export interface IS2C_SNAKE_LOAD_SNAKE {
        /** 蛇id */
        id: number
        /** 蛇名 */
        name: string
        /** 头部id */
        hid?: number
    }

    /** <服务端返回>蛇卸载 */
    export interface IS2C_SNAKE_UNLOAD {
        /** 卸载蛇id集合 */
        unloadSnakeIds: number[]
    }

    /** <服务端返回>蛇头部更新 */
    export interface IS2C_SNAKE_HID_UPDATE {
        /** 蛇头部更新集合 */
        snakes: IS2C_SNAKE_HID_UPDATE_SNAKE[]
    }

    export interface IS2C_SNAKE_HID_UPDATE_SNAKE {
        /** 蛇id */
        id: number
        /** 头部id */
        hid: number
    }

    /** <服务端返回>蛇节点加载 */
    export interface IS2C_SNAKE_NODE_LOAD {
        /** 加载蛇集合 */
        loadSnakes: IS2C_SNAKE_NODE_LOAD_SNAKE[]
    }

    export interface IS2C_SNAKE_NODE_LOAD_NODE {
        /** 节点id */
        id: number
        /** 坐标x(x100) */
        x: number
        /** 坐标y(x100) */
        y: number
        /** 角度(x100) */
        ang: number
        /** 第几节点 */
        idx: number
    }

    export interface IS2C_SNAKE_NODE_LOAD_SNAKE {
        /** 蛇id */
        id: number
        /** 宽度(x100) */
        w: number
        /** 颜色整型 */
        rgbs: number[]
        /** 加载蛇节点集合 */
        loadNodes: IS2C_SNAKE_NODE_LOAD_NODE[]
    }

    /** <服务端返回>蛇节点卸载 */
    export interface IS2C_SNAKE_NODE_UNLOAD {
        /** 卸载蛇节点id集合 */
        unloadNodeIds: number[]
    }

    /** <服务端返回>食物加载 */
    export interface IS2C_FOOD_LOAD {
        /** 加载食物集合 */
        loadFoods: IS2C_FOOD_LOAD_FOOD[]
    }

    export interface IS2C_FOOD_LOAD_FOOD {
        /** 食物id */
        id: number
        /** 坐标x(x100) */
        x: number
        /** 坐标y(x100) */
        y: number
        /** 宽度(x100) */
        w: number
        /** 颜色整型(+1) */
        rgb?: number
    }

    /** <服务端返回>食物卸载 */
    export interface IS2C_FOOD_UNLOAD {
        /** 卸载食物集合 */
        unloadFoods: IS2C_FOOD_UNLOAD_FOOD[]
    }

    export interface IS2C_FOOD_UNLOAD_FOOD {
        /** 食物id */
        id: number
        /** 吃了食物蛇节点id */
        eaterId?: number
    }
}